from typing import Callable
import time


def time_it(n):
    def decorator(f: Callable):
        def wrapper(*args, **kwargs):
            start = time.time_ns()
            for _ in range(n):
                f(*args, **kwargs)
            end = time.time_ns()
            print(f"end-start={end - start}")

        return wrapper

    return decorator


# 装饰器的一般实现形式：形参为函数类型，返回值类型为函数类型的函数
# 通过装饰器可以实现在不修改原函数实现的情况，增强原函数功能
# 带参数的装饰器：需要在初始装饰器函数的外层再包一层
@time_it(10000)
def func(i, j) -> None:
    print(f"func() is invoked, i={i}, j={j}")


def main() -> None:
    func(i=1, j=2)


if __name__ == '__main__':
    main()
